{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 区域检测模型训练\n",
    "\n",
    "> 使用FL-CNN模型进行文档图片区域检测，全套程序使用Python完成，主要的开发框架有Tensorflow、Keras、Numpy、Pillow。如需重新训练该模型，可在`'./datasets'`目录当中添加新的训练样本，然后点击菜单栏 Kernel -> Restart & Run All，完成训练后会默认自动将模型保存在`'./models/'`目录下。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入深度学习框架并开始构建神经网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "np.random.seed(3) # 固定初始随机值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as mpatches"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/kk/.local/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import keras\n",
    "import keras.backend as K\n",
    "from keras.layers import (\n",
    "    Input, Conv2D, MaxPool2D, LeakyReLU, BatchNormalization,\n",
    "    LocallyConnected2D, Flatten, Dense, Dropout, Reshape, ZeroPadding2D,\n",
    "    UpSampling2D, Conv2DTranspose, Concatenate)\n",
    "from keras.models import Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from tqdm import tqdm\n",
    "from PIL import Image\n",
    "import os\n",
    "import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from libs.datasetFuncs import getDatas, datas2X, getTargets, targets2TrainY\n",
    "from libs.tools import drawAreaRect, calcAreaBoxs, formatImage, calcSourceBoxs, calcAccurateBoxs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始配置\n",
    "\n",
    "- `image_shape`: 输入图片数据的Shape；\n",
    "- `batch_size`: 训练批次大小，一般不需要改变；\n",
    "- `epochs_num`: 训练轮数，可以根据实际情况调整，但不宜过大。\n",
    "- `data_path`: 原始图片目录\n",
    "- `target_path`: 标记图片目录\n",
    "- `model_dir`: 保存模型文件的目录\n",
    "- `model_filename`: 当前模型文件的文件名称"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "USE_CLEAN = False # 是否清除已有的权重\n",
    "USE_TRAINING = False # 是否训练模型\n",
    "\n",
    "image_shape = (128, 128, 3) # 图片的（高，宽，rgb通道）\n",
    "batch_size = 50\n",
    "epochs_num = 300\n",
    "\n",
    "data_path = './test_data/idcard_data'\n",
    "target_path = './test_data/idcard_label'\n",
    "model_dir = './models/'\n",
    "model_filename = 'idcard.h5'\n",
    "\n",
    "pcolors=[\n",
    "    [255, 0, 0], [255, 255, 0], [0, 0, 255]]# , [255, 255, 0]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 开始导入数据\n",
    "\n",
    "**如果数据量庞大，可能需要比较长的时间导入，需要耐心等待！**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(68, 128, 128, 3)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "datas = getDatas(data_path)\n",
    "train_X = datas2X(datas)\n",
    "train_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████| 68/68 [00:00<00:00, 104.78it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(68, 128, 128, 3) float32 3\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "targets, classes_num = getTargets(target_path, pcolors=np.array(pcolors))\n",
    "train_Y = targets2TrainY(targets)\n",
    "print(train_Y.shape, train_Y.dtype, classes_num)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对象&方法说明\n",
    "\n",
    "- Conv2D 二维卷积操作\n",
    "- MaxPool2D 最大值下采样\n",
    "- BatchNormalization 批标准化，标准化层间输入数据数值\n",
    "- relu 为激活方程\n",
    "- ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "input_image = Input(shape=image_shape, name='input_image') # 输入\n",
    "\n",
    "conv1 = Conv2D(1, (1, 1), padding='same')(input_image)\n",
    "pool1 = MaxPool2D((2, 2))(conv1)\n",
    "\n",
    "conv2 = LeakyReLU(0.3)(Conv2D(3, (3, 3), padding='same')(pool1))\n",
    "pool2 = MaxPool2D((2, 2))(conv2)\n",
    "\n",
    "normalized1 = BatchNormalization(axis=1)(pool2)\n",
    "conv3 = LeakyReLU(0.3)(Conv2D(5, (3, 3), padding='same')(normalized1))\n",
    "pool3 = MaxPool2D((2, 2))(conv3)\n",
    "\n",
    "conv4 = LeakyReLU(0.3)(Conv2D(8, (3, 3), padding='same')(pool3))\n",
    "pool4 = MaxPool2D((2, 2))(conv4)\n",
    "\n",
    "normalized2 = BatchNormalization(axis=1)(pool4)\n",
    "\n",
    "flattened = Flatten()(normalized2)\n",
    "dense1 = Dense(256, activation='relu')(flattened)\n",
    "droped = Dropout(0.5)(dense1)\n",
    "dense2 = Dense(8 * 8**2, activation='relu')(droped)\n",
    "\n",
    "lcon1 = LocallyConnected2D(8, (3, 3), activation='relu')(normalized2)\n",
    "padd1 = ZeroPadding2D()(lcon1)\n",
    "lcon2 = LocallyConnected2D(8, (3, 3), activation='relu')(padd1)\n",
    "padd2 = ZeroPadding2D()(lcon2)\n",
    "\n",
    "reshaped = Reshape((8, 8, 8))(dense2)\n",
    "concatenated1 = Concatenate()([reshaped, padd2])\n",
    "\n",
    "decv1 = Conv2DTranspose(8, (3, 3), strides=2, padding='same', activation='relu')(concatenated1)\n",
    "decv2 = Conv2DTranspose(5, (3, 3), strides=2, padding='same', activation='relu')(decv1)\n",
    "decv3 = Conv2DTranspose(3, (3, 3), strides=2, padding='same', activation='relu')(decv2)\n",
    "\n",
    "concatenated2 = Concatenate()([pool1, decv3])\n",
    "decv4 = Conv2DTranspose(classes_num * 2, (3, 3), strides=2, padding='same', activation='relu')(concatenated2)\n",
    "output_mask = Conv2DTranspose(classes_num, (3, 3), padding='same', activation='relu')(decv4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# def NMSE(y_true, y_pred):\n",
    "#     mean = K.mean(y_true) + K.epsilon()\n",
    "#     k = 0.5 / mean\n",
    "#     r = 1 / k\n",
    "#     return r * K.mean(K.square(k * (y_true - y_pred)))\n",
    "\n",
    "def NMSE(y_true, y_pred):\n",
    "    mean = K.mean(y_true, axis=(0, 1, 2)) + K.epsilon()\n",
    "    k = K.reshape(0.5 / mean, shape=(-1, classes_num))\n",
    "    r = 1 / k\n",
    "    return K.mean(r * K.square(k * (y_true - y_pred)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if not USE_CLEAN and os.path.isfile(os.path.join(model_dir, model_filename)):\n",
    "    model = keras.models.load_model(os.path.join(model_dir, model_filename),\n",
    "                                    custom_objects={'NMSE':NMSE})\n",
    "else:\n",
    "    USE_CLEAN = True\n",
    "    model = Model(inputs=input_image, outputs=output_mask)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对象&方法说明\n",
    "\n",
    "- Adam 训练优化器的一种\n",
    "- mse 均方差代价函数\n",
    "- metrics=['mae'] 均绝对值差距离评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if USE_CLEAN:\n",
    "    model.compile(optimizer='Adam', loss=NMSE, metrics=['mae'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可视化神经网络结构\n",
    "\n",
    "**PS:** 使用该功能需安装 pydot 包，可以使用命令：`pip install pydot` 进行安装。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"2130pt\" viewBox=\"0.00 0.00 833.50 2130.00\" width=\"834pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 2126)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-2126 829.5,-2126 829.5,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 140715062658216 -->\n",
       "<g class=\"node\" id=\"node1\"><title>140715062658216</title>\n",
       "<polygon fill=\"none\" points=\"472,-2075.5 472,-2121.5 774,-2121.5 774,-2075.5 472,-2075.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"533\" y=\"-2094.8\">InputX: InputLayer</text>\n",
       "<polyline fill=\"none\" points=\"594,-2075.5 594,-2121.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"621.5\" y=\"-2106.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"594,-2098.5 649,-2098.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"621.5\" y=\"-2083.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"649,-2075.5 649,-2121.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"711.5\" y=\"-2106.3\">(None, 128, 128, 3)</text>\n",
       "<polyline fill=\"none\" points=\"649,-2098.5 774,-2098.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"711.5\" y=\"-2083.3\">(None, 128, 128, 3)</text>\n",
       "</g>\n",
       "<!-- 140715069843272 -->\n",
       "<g class=\"node\" id=\"node2\"><title>140715069843272</title>\n",
       "<polygon fill=\"none\" points=\"471.5,-1992.5 471.5,-2038.5 774.5,-2038.5 774.5,-1992.5 471.5,-1992.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"533\" y=\"-2011.8\">conv2d_1: Conv2D</text>\n",
       "<polyline fill=\"none\" points=\"594.5,-1992.5 594.5,-2038.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"622\" y=\"-2023.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"594.5,-2015.5 649.5,-2015.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"622\" y=\"-2000.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"649.5,-1992.5 649.5,-2038.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"712\" y=\"-2023.3\">(None, 128, 128, 3)</text>\n",
       "<polyline fill=\"none\" points=\"649.5,-2015.5 774.5,-2015.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"712\" y=\"-2000.3\">(None, 128, 128, 1)</text>\n",
       "</g>\n",
       "<!-- 140715062658216&#45;&gt;140715069843272 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>140715062658216-&gt;140715069843272</title>\n",
       "<path d=\"M623,-2075.37C623,-2067.15 623,-2057.66 623,-2048.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"626.5,-2048.61 623,-2038.61 619.5,-2048.61 626.5,-2048.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069843160 -->\n",
       "<g class=\"node\" id=\"node3\"><title>140715069843160</title>\n",
       "<polygon fill=\"none\" points=\"429.5,-1909.5 429.5,-1955.5 816.5,-1955.5 816.5,-1909.5 429.5,-1909.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"533\" y=\"-1928.8\">max_pooling2d_1: MaxPooling2D</text>\n",
       "<polyline fill=\"none\" points=\"636.5,-1909.5 636.5,-1955.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"664\" y=\"-1940.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"636.5,-1932.5 691.5,-1932.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"664\" y=\"-1917.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"691.5,-1909.5 691.5,-1955.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"754\" y=\"-1940.3\">(None, 128, 128, 1)</text>\n",
       "<polyline fill=\"none\" points=\"691.5,-1932.5 816.5,-1932.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"754\" y=\"-1917.3\">(None, 64, 64, 1)</text>\n",
       "</g>\n",
       "<!-- 140715069843272&#45;&gt;140715069843160 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>140715069843272-&gt;140715069843160</title>\n",
       "<path d=\"M623,-1992.37C623,-1984.15 623,-1974.66 623,-1965.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"626.5,-1965.61 623,-1955.61 619.5,-1965.61 626.5,-1965.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069843888 -->\n",
       "<g class=\"node\" id=\"node4\"><title>140715069843888</title>\n",
       "<polygon fill=\"none\" points=\"383.5,-1826.5 383.5,-1872.5 672.5,-1872.5 672.5,-1826.5 383.5,-1826.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"445\" y=\"-1845.8\">conv2d_2: Conv2D</text>\n",
       "<polyline fill=\"none\" points=\"506.5,-1826.5 506.5,-1872.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"534\" y=\"-1857.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"506.5,-1849.5 561.5,-1849.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"534\" y=\"-1834.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"561.5,-1826.5 561.5,-1872.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"617\" y=\"-1857.3\">(None, 64, 64, 1)</text>\n",
       "<polyline fill=\"none\" points=\"561.5,-1849.5 672.5,-1849.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"617\" y=\"-1834.3\">(None, 64, 64, 3)</text>\n",
       "</g>\n",
       "<!-- 140715069843160&#45;&gt;140715069843888 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>140715069843160-&gt;140715069843888</title>\n",
       "<path d=\"M597.041,-1909.37C586.15,-1900.08 573.341,-1889.16 561.734,-1879.26\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"563.808,-1876.43 553.928,-1872.61 559.266,-1881.76 563.808,-1876.43\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062686216 -->\n",
       "<g class=\"node\" id=\"node28\"><title>140715062686216</title>\n",
       "<polygon fill=\"none\" points=\"380.5,-166.5 380.5,-212.5 825.5,-212.5 825.5,-166.5 380.5,-166.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"464.5\" y=\"-185.8\">concatenate_2: Concatenate</text>\n",
       "<polyline fill=\"none\" points=\"548.5,-166.5 548.5,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"576\" y=\"-197.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"548.5,-189.5 603.5,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"576\" y=\"-174.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"603.5,-166.5 603.5,-212.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"714.5\" y=\"-197.3\">[(None, 64, 64, 1), (None, 64, 64, 3)]</text>\n",
       "<polyline fill=\"none\" points=\"603.5,-189.5 825.5,-189.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"714.5\" y=\"-174.3\">(None, 64, 64, 4)</text>\n",
       "</g>\n",
       "<!-- 140715069843160&#45;&gt;140715062686216 -->\n",
       "<g class=\"edge\" id=\"edge28\"><title>140715069843160-&gt;140715062686216</title>\n",
       "<path d=\"M649.583,-1909.37C660.491,-1899.2 672.522,-1886.42 681,-1873 707.617,-1830.87 719,-1817.34 719,-1767.5 719,-1767.5 719,-1767.5 719,-354.5 719,-306.691 725.297,-288.25 698,-249 689.374,-236.597 677.185,-226.321 664.405,-218.027\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"665.861,-214.815 655.5,-212.601 662.218,-220.793 665.861,-214.815\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069844056 -->\n",
       "<g class=\"node\" id=\"node5\"><title>140715069844056</title>\n",
       "<polygon fill=\"none\" points=\"341,-1743.5 341,-1789.5 675,-1789.5 675,-1743.5 341,-1743.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"425\" y=\"-1762.8\">leaky_re_lu_1: LeakyReLU</text>\n",
       "<polyline fill=\"none\" points=\"509,-1743.5 509,-1789.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"536.5\" y=\"-1774.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"509,-1766.5 564,-1766.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"536.5\" y=\"-1751.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"564,-1743.5 564,-1789.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"619.5\" y=\"-1774.3\">(None, 64, 64, 3)</text>\n",
       "<polyline fill=\"none\" points=\"564,-1766.5 675,-1766.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"619.5\" y=\"-1751.3\">(None, 64, 64, 3)</text>\n",
       "</g>\n",
       "<!-- 140715069843888&#45;&gt;140715069844056 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>140715069843888-&gt;140715069844056</title>\n",
       "<path d=\"M522.535,-1826.37C520.485,-1818.06 518.111,-1808.45 515.885,-1799.43\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"519.254,-1798.48 513.458,-1789.61 512.458,-1800.15 519.254,-1798.48\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069844560 -->\n",
       "<g class=\"node\" id=\"node6\"><title>140715069844560</title>\n",
       "<polygon fill=\"none\" points=\"304.5,-1660.5 304.5,-1706.5 677.5,-1706.5 677.5,-1660.5 304.5,-1660.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"408\" y=\"-1679.8\">max_pooling2d_2: MaxPooling2D</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1660.5 511.5,-1706.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"539\" y=\"-1691.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1683.5 566.5,-1683.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"539\" y=\"-1668.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"566.5,-1660.5 566.5,-1706.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"622\" y=\"-1691.3\">(None, 64, 64, 3)</text>\n",
       "<polyline fill=\"none\" points=\"566.5,-1683.5 677.5,-1683.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"622\" y=\"-1668.3\">(None, 32, 32, 3)</text>\n",
       "</g>\n",
       "<!-- 140715069844056&#45;&gt;140715069844560 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>140715069844056-&gt;140715069844560</title>\n",
       "<path d=\"M503.355,-1743.37C501.612,-1735.06 499.595,-1725.45 497.702,-1716.43\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"501.119,-1715.67 495.64,-1706.61 494.268,-1717.11 501.119,-1715.67\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069844672 -->\n",
       "<g class=\"node\" id=\"node7\"><title>140715069844672</title>\n",
       "<polygon fill=\"none\" points=\"265,-1577.5 265,-1623.5 691,-1623.5 691,-1577.5 265,-1577.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1596.8\">batch_normalization_1: BatchNormalization</text>\n",
       "<polyline fill=\"none\" points=\"525,-1577.5 525,-1623.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"552.5\" y=\"-1608.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"525,-1600.5 580,-1600.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"552.5\" y=\"-1585.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"580,-1577.5 580,-1623.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"635.5\" y=\"-1608.3\">(None, 32, 32, 3)</text>\n",
       "<polyline fill=\"none\" points=\"580,-1600.5 691,-1600.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"635.5\" y=\"-1585.3\">(None, 32, 32, 3)</text>\n",
       "</g>\n",
       "<!-- 140715069844560&#45;&gt;140715069844672 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>140715069844560-&gt;140715069844672</title>\n",
       "<path d=\"M487.448,-1660.37C486.129,-1652.15 484.606,-1642.66 483.172,-1633.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"486.589,-1632.93 481.548,-1623.61 479.677,-1634.04 486.589,-1632.93\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069844728 -->\n",
       "<g class=\"node\" id=\"node8\"><title>140715069844728</title>\n",
       "<polygon fill=\"none\" points=\"333.5,-1494.5 333.5,-1540.5 622.5,-1540.5 622.5,-1494.5 333.5,-1494.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1513.8\">conv2d_3: Conv2D</text>\n",
       "<polyline fill=\"none\" points=\"456.5,-1494.5 456.5,-1540.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"484\" y=\"-1525.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"456.5,-1517.5 511.5,-1517.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"484\" y=\"-1502.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1494.5 511.5,-1540.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"567\" y=\"-1525.3\">(None, 32, 32, 3)</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1517.5 622.5,-1517.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"567\" y=\"-1502.3\">(None, 32, 32, 5)</text>\n",
       "</g>\n",
       "<!-- 140715069844672&#45;&gt;140715069844728 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>140715069844672-&gt;140715069844728</title>\n",
       "<path d=\"M478,-1577.37C478,-1569.15 478,-1559.66 478,-1550.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1550.61 478,-1540.61 474.5,-1550.61 481.5,-1550.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069845232 -->\n",
       "<g class=\"node\" id=\"node9\"><title>140715069845232</title>\n",
       "<polygon fill=\"none\" points=\"311,-1411.5 311,-1457.5 645,-1457.5 645,-1411.5 311,-1411.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1430.8\">leaky_re_lu_2: LeakyReLU</text>\n",
       "<polyline fill=\"none\" points=\"479,-1411.5 479,-1457.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"506.5\" y=\"-1442.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"479,-1434.5 534,-1434.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"506.5\" y=\"-1419.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"534,-1411.5 534,-1457.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"589.5\" y=\"-1442.3\">(None, 32, 32, 5)</text>\n",
       "<polyline fill=\"none\" points=\"534,-1434.5 645,-1434.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"589.5\" y=\"-1419.3\">(None, 32, 32, 5)</text>\n",
       "</g>\n",
       "<!-- 140715069844728&#45;&gt;140715069845232 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>140715069844728-&gt;140715069845232</title>\n",
       "<path d=\"M478,-1494.37C478,-1486.15 478,-1476.66 478,-1467.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1467.61 478,-1457.61 474.5,-1467.61 481.5,-1467.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069844952 -->\n",
       "<g class=\"node\" id=\"node10\"><title>140715069844952</title>\n",
       "<polygon fill=\"none\" points=\"291.5,-1328.5 291.5,-1374.5 664.5,-1374.5 664.5,-1328.5 291.5,-1328.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1347.8\">max_pooling2d_3: MaxPooling2D</text>\n",
       "<polyline fill=\"none\" points=\"498.5,-1328.5 498.5,-1374.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"526\" y=\"-1359.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"498.5,-1351.5 553.5,-1351.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"526\" y=\"-1336.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"553.5,-1328.5 553.5,-1374.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"609\" y=\"-1359.3\">(None, 32, 32, 5)</text>\n",
       "<polyline fill=\"none\" points=\"553.5,-1351.5 664.5,-1351.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"609\" y=\"-1336.3\">(None, 16, 16, 5)</text>\n",
       "</g>\n",
       "<!-- 140715069845232&#45;&gt;140715069844952 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>140715069845232-&gt;140715069844952</title>\n",
       "<path d=\"M478,-1411.37C478,-1403.15 478,-1393.66 478,-1384.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1384.61 478,-1374.61 474.5,-1384.61 481.5,-1384.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069842376 -->\n",
       "<g class=\"node\" id=\"node11\"><title>140715069842376</title>\n",
       "<polygon fill=\"none\" points=\"333.5,-1245.5 333.5,-1291.5 622.5,-1291.5 622.5,-1245.5 333.5,-1245.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1264.8\">conv2d_4: Conv2D</text>\n",
       "<polyline fill=\"none\" points=\"456.5,-1245.5 456.5,-1291.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"484\" y=\"-1276.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"456.5,-1268.5 511.5,-1268.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"484\" y=\"-1253.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1245.5 511.5,-1291.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"567\" y=\"-1276.3\">(None, 16, 16, 5)</text>\n",
       "<polyline fill=\"none\" points=\"511.5,-1268.5 622.5,-1268.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"567\" y=\"-1253.3\">(None, 16, 16, 8)</text>\n",
       "</g>\n",
       "<!-- 140715069844952&#45;&gt;140715069842376 -->\n",
       "<g class=\"edge\" id=\"edge10\"><title>140715069844952-&gt;140715069842376</title>\n",
       "<path d=\"M478,-1328.37C478,-1320.15 478,-1310.66 478,-1301.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1301.61 478,-1291.61 474.5,-1301.61 481.5,-1301.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069842880 -->\n",
       "<g class=\"node\" id=\"node12\"><title>140715069842880</title>\n",
       "<polygon fill=\"none\" points=\"311,-1162.5 311,-1208.5 645,-1208.5 645,-1162.5 311,-1162.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1181.8\">leaky_re_lu_3: LeakyReLU</text>\n",
       "<polyline fill=\"none\" points=\"479,-1162.5 479,-1208.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"506.5\" y=\"-1193.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"479,-1185.5 534,-1185.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"506.5\" y=\"-1170.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"534,-1162.5 534,-1208.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"589.5\" y=\"-1193.3\">(None, 16, 16, 8)</text>\n",
       "<polyline fill=\"none\" points=\"534,-1185.5 645,-1185.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"589.5\" y=\"-1170.3\">(None, 16, 16, 8)</text>\n",
       "</g>\n",
       "<!-- 140715069842376&#45;&gt;140715069842880 -->\n",
       "<g class=\"edge\" id=\"edge11\"><title>140715069842376-&gt;140715069842880</title>\n",
       "<path d=\"M478,-1245.37C478,-1237.15 478,-1227.66 478,-1218.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1218.61 478,-1208.61 474.5,-1218.61 481.5,-1218.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715069842936 -->\n",
       "<g class=\"node\" id=\"node13\"><title>140715069842936</title>\n",
       "<polygon fill=\"none\" points=\"291.5,-1079.5 291.5,-1125.5 664.5,-1125.5 664.5,-1079.5 291.5,-1079.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"395\" y=\"-1098.8\">max_pooling2d_4: MaxPooling2D</text>\n",
       "<polyline fill=\"none\" points=\"498.5,-1079.5 498.5,-1125.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"526\" y=\"-1110.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"498.5,-1102.5 553.5,-1102.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"526\" y=\"-1087.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"553.5,-1079.5 553.5,-1125.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"609\" y=\"-1110.3\">(None, 16, 16, 8)</text>\n",
       "<polyline fill=\"none\" points=\"553.5,-1102.5 664.5,-1102.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"609\" y=\"-1087.3\">(None, 8, 8, 8)</text>\n",
       "</g>\n",
       "<!-- 140715069842880&#45;&gt;140715069842936 -->\n",
       "<g class=\"edge\" id=\"edge12\"><title>140715069842880-&gt;140715069842936</title>\n",
       "<path d=\"M478,-1162.37C478,-1154.15 478,-1144.66 478,-1135.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1135.61 478,-1125.61 474.5,-1135.61 481.5,-1135.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715174484008 -->\n",
       "<g class=\"node\" id=\"node14\"><title>140715174484008</title>\n",
       "<polygon fill=\"none\" points=\"271.5,-996.5 271.5,-1042.5 684.5,-1042.5 684.5,-996.5 271.5,-996.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"401.5\" y=\"-1015.8\">batch_normalization_2: BatchNormalization</text>\n",
       "<polyline fill=\"none\" points=\"531.5,-996.5 531.5,-1042.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"559\" y=\"-1027.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"531.5,-1019.5 586.5,-1019.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"559\" y=\"-1004.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"586.5,-996.5 586.5,-1042.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"635.5\" y=\"-1027.3\">(None, 8, 8, 8)</text>\n",
       "<polyline fill=\"none\" points=\"586.5,-1019.5 684.5,-1019.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"635.5\" y=\"-1004.3\">(None, 8, 8, 8)</text>\n",
       "</g>\n",
       "<!-- 140715069842936&#45;&gt;140715174484008 -->\n",
       "<g class=\"edge\" id=\"edge13\"><title>140715069842936-&gt;140715174484008</title>\n",
       "<path d=\"M478,-1079.37C478,-1071.15 478,-1061.66 478,-1052.73\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"481.5,-1052.61 478,-1042.61 474.5,-1052.61 481.5,-1052.61\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140716221622648 -->\n",
       "<g class=\"node\" id=\"node15\"><title>140716221622648</title>\n",
       "<polygon fill=\"none\" points=\"95.5,-913.5 95.5,-959.5 358.5,-959.5 358.5,-913.5 95.5,-913.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"150.5\" y=\"-932.8\">flatten_1: Flatten</text>\n",
       "<polyline fill=\"none\" points=\"205.5,-913.5 205.5,-959.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"233\" y=\"-944.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"205.5,-936.5 260.5,-936.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"233\" y=\"-921.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"260.5,-913.5 260.5,-959.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"309.5\" y=\"-944.3\">(None, 8, 8, 8)</text>\n",
       "<polyline fill=\"none\" points=\"260.5,-936.5 358.5,-936.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"309.5\" y=\"-921.3\">(None, 512)</text>\n",
       "</g>\n",
       "<!-- 140715174484008&#45;&gt;140716221622648 -->\n",
       "<g class=\"edge\" id=\"edge14\"><title>140715174484008-&gt;140716221622648</title>\n",
       "<path d=\"M409.745,-996.473C377.374,-986.027 338.536,-973.494 305.005,-962.673\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"305.833,-959.263 295.242,-959.522 303.684,-965.924 305.833,-959.263\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062658664 -->\n",
       "<g class=\"node\" id=\"node17\"><title>140715062658664</title>\n",
       "<polygon fill=\"none\" points=\"273,-830.5 273,-876.5 691,-876.5 691,-830.5 273,-830.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"405.5\" y=\"-849.8\">locally_connected2d_1: LocallyConnected2D</text>\n",
       "<polyline fill=\"none\" points=\"538,-830.5 538,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"565.5\" y=\"-861.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"538,-853.5 593,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"565.5\" y=\"-838.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"593,-830.5 593,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-861.3\">(None, 8, 8, 8)</text>\n",
       "<polyline fill=\"none\" points=\"593,-853.5 691,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-838.3\">(None, 6, 6, 8)</text>\n",
       "</g>\n",
       "<!-- 140715174484008&#45;&gt;140715062658664 -->\n",
       "<g class=\"edge\" id=\"edge16\"><title>140715174484008-&gt;140715062658664</title>\n",
       "<path d=\"M478.539,-996.382C479.227,-968.182 480.422,-919.206 481.212,-886.821\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"484.718,-886.611 481.463,-876.529 477.72,-886.44 484.718,-886.611\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062594080 -->\n",
       "<g class=\"node\" id=\"node16\"><title>140715062594080</title>\n",
       "<polygon fill=\"none\" points=\"15,-830.5 15,-876.5 255,-876.5 255,-830.5 15,-830.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"66\" y=\"-849.8\">dense_1: Dense</text>\n",
       "<polyline fill=\"none\" points=\"117,-830.5 117,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"144.5\" y=\"-861.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"117,-853.5 172,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"144.5\" y=\"-838.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"172,-830.5 172,-876.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"213.5\" y=\"-861.3\">(None, 512)</text>\n",
       "<polyline fill=\"none\" points=\"172,-853.5 255,-853.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"213.5\" y=\"-838.3\">(None, 256)</text>\n",
       "</g>\n",
       "<!-- 140716221622648&#45;&gt;140715062594080 -->\n",
       "<g class=\"edge\" id=\"edge15\"><title>140716221622648-&gt;140715062594080</title>\n",
       "<path d=\"M201.861,-913.366C191.313,-904.08 178.91,-893.16 167.668,-883.262\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"169.927,-880.588 160.109,-876.607 165.302,-885.842 169.927,-880.588\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062659056 -->\n",
       "<g class=\"node\" id=\"node18\"><title>140715062659056</title>\n",
       "<polygon fill=\"none\" points=\"3.5,-747.5 3.5,-793.5 266.5,-793.5 266.5,-747.5 3.5,-747.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"66\" y=\"-766.8\">dropout_1: Dropout</text>\n",
       "<polyline fill=\"none\" points=\"128.5,-747.5 128.5,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"156\" y=\"-778.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"128.5,-770.5 183.5,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"156\" y=\"-755.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"183.5,-747.5 183.5,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"225\" y=\"-778.3\">(None, 256)</text>\n",
       "<polyline fill=\"none\" points=\"183.5,-770.5 266.5,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"225\" y=\"-755.3\">(None, 256)</text>\n",
       "</g>\n",
       "<!-- 140715062594080&#45;&gt;140715062659056 -->\n",
       "<g class=\"edge\" id=\"edge17\"><title>140715062594080-&gt;140715062659056</title>\n",
       "<path d=\"M135,-830.366C135,-822.152 135,-812.658 135,-803.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"138.5,-803.607 135,-793.607 131.5,-803.607 138.5,-803.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062659336 -->\n",
       "<g class=\"node\" id=\"node19\"><title>140715062659336</title>\n",
       "<polygon fill=\"none\" points=\"300,-747.5 300,-793.5 664,-793.5 664,-747.5 300,-747.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"405.5\" y=\"-766.8\">zero_padding2d_1: ZeroPadding2D</text>\n",
       "<polyline fill=\"none\" points=\"511,-747.5 511,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"538.5\" y=\"-778.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"511,-770.5 566,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"538.5\" y=\"-755.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"566,-747.5 566,-793.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"615\" y=\"-778.3\">(None, 6, 6, 8)</text>\n",
       "<polyline fill=\"none\" points=\"566,-770.5 664,-770.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"615\" y=\"-755.3\">(None, 8, 8, 8)</text>\n",
       "</g>\n",
       "<!-- 140715062658664&#45;&gt;140715062659336 -->\n",
       "<g class=\"edge\" id=\"edge18\"><title>140715062658664-&gt;140715062659336</title>\n",
       "<path d=\"M482,-830.366C482,-822.152 482,-812.658 482,-803.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"485.5,-803.607 482,-793.607 478.5,-803.607 485.5,-803.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062659448 -->\n",
       "<g class=\"node\" id=\"node20\"><title>140715062659448</title>\n",
       "<polygon fill=\"none\" points=\"15,-664.5 15,-710.5 255,-710.5 255,-664.5 15,-664.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"66\" y=\"-683.8\">dense_2: Dense</text>\n",
       "<polyline fill=\"none\" points=\"117,-664.5 117,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"144.5\" y=\"-695.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"117,-687.5 172,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"144.5\" y=\"-672.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"172,-664.5 172,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"213.5\" y=\"-695.3\">(None, 256)</text>\n",
       "<polyline fill=\"none\" points=\"172,-687.5 255,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"213.5\" y=\"-672.3\">(None, 512)</text>\n",
       "</g>\n",
       "<!-- 140715062659056&#45;&gt;140715062659448 -->\n",
       "<g class=\"edge\" id=\"edge19\"><title>140715062659056-&gt;140715062659448</title>\n",
       "<path d=\"M135,-747.366C135,-739.152 135,-729.658 135,-720.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"138.5,-720.607 135,-710.607 131.5,-720.607 138.5,-720.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062659784 -->\n",
       "<g class=\"node\" id=\"node21\"><title>140715062659784</title>\n",
       "<polygon fill=\"none\" points=\"273,-664.5 273,-710.5 691,-710.5 691,-664.5 273,-664.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"405.5\" y=\"-683.8\">locally_connected2d_2: LocallyConnected2D</text>\n",
       "<polyline fill=\"none\" points=\"538,-664.5 538,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"565.5\" y=\"-695.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"538,-687.5 593,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"565.5\" y=\"-672.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"593,-664.5 593,-710.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-695.3\">(None, 8, 8, 8)</text>\n",
       "<polyline fill=\"none\" points=\"593,-687.5 691,-687.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"642\" y=\"-672.3\">(None, 6, 6, 8)</text>\n",
       "</g>\n",
       "<!-- 140715062659336&#45;&gt;140715062659784 -->\n",
       "<g class=\"edge\" id=\"edge20\"><title>140715062659336-&gt;140715062659784</title>\n",
       "<path d=\"M482,-747.366C482,-739.152 482,-729.658 482,-720.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"485.5,-720.607 482,-710.607 478.5,-720.607 485.5,-720.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660176 -->\n",
       "<g class=\"node\" id=\"node22\"><title>140715062660176</title>\n",
       "<polygon fill=\"none\" points=\"0,-581.5 0,-627.5 278,-627.5 278,-581.5 0,-581.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"62.5\" y=\"-600.8\">reshape_1: Reshape</text>\n",
       "<polyline fill=\"none\" points=\"125,-581.5 125,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"152.5\" y=\"-612.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"125,-604.5 180,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"152.5\" y=\"-589.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"180,-581.5 180,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"229\" y=\"-612.3\">(None, 512)</text>\n",
       "<polyline fill=\"none\" points=\"180,-604.5 278,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"229\" y=\"-589.3\">(None, 8, 8, 8)</text>\n",
       "</g>\n",
       "<!-- 140715062659448&#45;&gt;140715062660176 -->\n",
       "<g class=\"edge\" id=\"edge21\"><title>140715062659448-&gt;140715062660176</title>\n",
       "<path d=\"M136.093,-664.366C136.499,-656.152 136.968,-646.658 137.409,-637.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"140.911,-637.767 137.908,-627.607 133.919,-637.422 140.911,-637.767\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660232 -->\n",
       "<g class=\"node\" id=\"node23\"><title>140715062660232</title>\n",
       "<polygon fill=\"none\" points=\"300,-581.5 300,-627.5 664,-627.5 664,-581.5 300,-581.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"405.5\" y=\"-600.8\">zero_padding2d_2: ZeroPadding2D</text>\n",
       "<polyline fill=\"none\" points=\"511,-581.5 511,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"538.5\" y=\"-612.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"511,-604.5 566,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"538.5\" y=\"-589.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"566,-581.5 566,-627.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"615\" y=\"-612.3\">(None, 6, 6, 8)</text>\n",
       "<polyline fill=\"none\" points=\"566,-604.5 664,-604.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"615\" y=\"-589.3\">(None, 8, 8, 8)</text>\n",
       "</g>\n",
       "<!-- 140715062659784&#45;&gt;140715062660232 -->\n",
       "<g class=\"edge\" id=\"edge22\"><title>140715062659784-&gt;140715062660232</title>\n",
       "<path d=\"M482,-664.366C482,-656.152 482,-646.658 482,-637.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"485.5,-637.607 482,-627.607 478.5,-637.607 485.5,-637.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660344 -->\n",
       "<g class=\"node\" id=\"node24\"><title>140715062660344</title>\n",
       "<polygon fill=\"none\" points=\"273,-498.5 273,-544.5 691,-544.5 691,-498.5 273,-498.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"357\" y=\"-517.8\">concatenate_1: Concatenate</text>\n",
       "<polyline fill=\"none\" points=\"441,-498.5 441,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"468.5\" y=\"-529.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"441,-521.5 496,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"468.5\" y=\"-506.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"496,-498.5 496,-544.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"593.5\" y=\"-529.3\">[(None, 8, 8, 8), (None, 8, 8, 8)]</text>\n",
       "<polyline fill=\"none\" points=\"496,-521.5 691,-521.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"593.5\" y=\"-506.3\">(None, 8, 8, 16)</text>\n",
       "</g>\n",
       "<!-- 140715062660176&#45;&gt;140715062660344 -->\n",
       "<g class=\"edge\" id=\"edge23\"><title>140715062660176-&gt;140715062660344</title>\n",
       "<path d=\"M232.273,-581.473C277.648,-570.758 332.321,-557.847 378.928,-546.841\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"379.818,-550.227 388.745,-544.522 378.209,-543.414 379.818,-550.227\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660232&#45;&gt;140715062660344 -->\n",
       "<g class=\"edge\" id=\"edge24\"><title>140715062660232-&gt;140715062660344</title>\n",
       "<path d=\"M482,-581.366C482,-573.152 482,-563.658 482,-554.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"485.5,-554.607 482,-544.607 478.5,-554.607 485.5,-554.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660400 -->\n",
       "<g class=\"node\" id=\"node25\"><title>140715062660400</title>\n",
       "<polygon fill=\"none\" points=\"283,-415.5 283,-461.5 685,-461.5 685,-415.5 283,-415.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"401\" y=\"-434.8\">conv2d_transpose_1: Conv2DTranspose</text>\n",
       "<polyline fill=\"none\" points=\"519,-415.5 519,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"546.5\" y=\"-446.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"519,-438.5 574,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"546.5\" y=\"-423.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"574,-415.5 574,-461.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"629.5\" y=\"-446.3\">(None, 8, 8, 16)</text>\n",
       "<polyline fill=\"none\" points=\"574,-438.5 685,-438.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"629.5\" y=\"-423.3\">(None, 16, 16, 8)</text>\n",
       "</g>\n",
       "<!-- 140715062660344&#45;&gt;140715062660400 -->\n",
       "<g class=\"edge\" id=\"edge25\"><title>140715062660344-&gt;140715062660400</title>\n",
       "<path d=\"M482.547,-498.366C482.749,-490.152 482.984,-480.658 483.204,-471.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"486.706,-471.69 483.454,-461.607 479.708,-471.517 486.706,-471.69\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062660792 -->\n",
       "<g class=\"node\" id=\"node26\"><title>140715062660792</title>\n",
       "<polygon fill=\"none\" points=\"285,-332.5 285,-378.5 687,-378.5 687,-332.5 285,-332.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"403\" y=\"-351.8\">conv2d_transpose_2: Conv2DTranspose</text>\n",
       "<polyline fill=\"none\" points=\"521,-332.5 521,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"548.5\" y=\"-363.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"521,-355.5 576,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"548.5\" y=\"-340.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"576,-332.5 576,-378.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"631.5\" y=\"-363.3\">(None, 16, 16, 8)</text>\n",
       "<polyline fill=\"none\" points=\"576,-355.5 687,-355.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"631.5\" y=\"-340.3\">(None, 32, 32, 5)</text>\n",
       "</g>\n",
       "<!-- 140715062660400&#45;&gt;140715062660792 -->\n",
       "<g class=\"edge\" id=\"edge26\"><title>140715062660400-&gt;140715062660792</title>\n",
       "<path d=\"M484.547,-415.366C484.749,-407.152 484.984,-397.658 485.204,-388.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"488.706,-388.69 485.454,-378.607 481.708,-388.517 488.706,-388.69\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062685824 -->\n",
       "<g class=\"node\" id=\"node27\"><title>140715062685824</title>\n",
       "<polygon fill=\"none\" points=\"287,-249.5 287,-295.5 689,-295.5 689,-249.5 287,-249.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"405\" y=\"-268.8\">conv2d_transpose_3: Conv2DTranspose</text>\n",
       "<polyline fill=\"none\" points=\"523,-249.5 523,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"550.5\" y=\"-280.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"523,-272.5 578,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"550.5\" y=\"-257.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"578,-249.5 578,-295.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"633.5\" y=\"-280.3\">(None, 32, 32, 5)</text>\n",
       "<polyline fill=\"none\" points=\"578,-272.5 689,-272.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"633.5\" y=\"-257.3\">(None, 64, 64, 3)</text>\n",
       "</g>\n",
       "<!-- 140715062660792&#45;&gt;140715062685824 -->\n",
       "<g class=\"edge\" id=\"edge27\"><title>140715062660792-&gt;140715062685824</title>\n",
       "<path d=\"M486.547,-332.366C486.749,-324.152 486.984,-314.658 487.204,-305.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"490.706,-305.69 487.454,-295.607 483.708,-305.517 490.706,-305.69\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062685824&#45;&gt;140715062686216 -->\n",
       "<g class=\"edge\" id=\"edge29\"><title>140715062685824-&gt;140715062686216</title>\n",
       "<path d=\"M519.424,-249.366C532.989,-239.812 549.009,-228.528 563.377,-218.409\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"565.454,-221.227 571.614,-212.607 561.423,-215.504 565.454,-221.227\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062686272 -->\n",
       "<g class=\"node\" id=\"node29\"><title>140715062686272</title>\n",
       "<polygon fill=\"none\" points=\"395,-83.5 395,-129.5 811,-129.5 811,-83.5 395,-83.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"513\" y=\"-102.8\">conv2d_transpose_4: Conv2DTranspose</text>\n",
       "<polyline fill=\"none\" points=\"631,-83.5 631,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"658.5\" y=\"-114.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"631,-106.5 686,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"658.5\" y=\"-91.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"686,-83.5 686,-129.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"748.5\" y=\"-114.3\">(None, 64, 64, 4)</text>\n",
       "<polyline fill=\"none\" points=\"686,-106.5 811,-106.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"748.5\" y=\"-91.3\">(None, 128, 128, 4)</text>\n",
       "</g>\n",
       "<!-- 140715062686216&#45;&gt;140715062686272 -->\n",
       "<g class=\"edge\" id=\"edge30\"><title>140715062686216-&gt;140715062686272</title>\n",
       "<path d=\"M603,-166.366C603,-158.152 603,-148.658 603,-139.725\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"606.5,-139.607 603,-129.607 599.5,-139.607 606.5,-139.607\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 140715062686664 -->\n",
       "<g class=\"node\" id=\"node30\"><title>140715062686664</title>\n",
       "<polygon fill=\"none\" points=\"426.5,-0.5 426.5,-46.5 779.5,-46.5 779.5,-0.5 426.5,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"513\" y=\"-19.8\">OutputY: Conv2DTranspose</text>\n",
       "<polyline fill=\"none\" points=\"599.5,-0.5 599.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"627\" y=\"-31.3\">input:</text>\n",
       "<polyline fill=\"none\" points=\"599.5,-23.5 654.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"627\" y=\"-8.3\">output:</text>\n",
       "<polyline fill=\"none\" points=\"654.5,-0.5 654.5,-46.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"717\" y=\"-31.3\">(None, 128, 128, 4)</text>\n",
       "<polyline fill=\"none\" points=\"654.5,-23.5 779.5,-23.5 \" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"717\" y=\"-8.3\">(None, 128, 128, 3)</text>\n",
       "</g>\n",
       "<!-- 140715062686272&#45;&gt;140715062686664 -->\n",
       "<g class=\"edge\" id=\"edge31\"><title>140715062686272-&gt;140715062686664</title>\n",
       "<path d=\"M603,-83.3664C603,-75.1516 603,-65.6579 603,-56.7252\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"606.5,-56.6068 603,-46.6068 599.5,-56.6069 606.5,-56.6068\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras.utils.vis_utils import model_to_dot\n",
    "from IPython.display import SVG\n",
    "\n",
    "SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试模型效率，默认测试运行1000次所用时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# def testPredict(epochs=1000):\n",
    "#     for i in tqdm(range(epochs), ncols=80):\n",
    "#         test = np.random.random((1,) + image_shape).astype('float32')\n",
    "#         model.predict(test)\n",
    "# testPredict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# %time testPredict(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 128, 128, 3)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.random.random((1,) + image_shape).astype('float32')\n",
    "y = model.predict(x)\n",
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def generator_ex_dataset(train_X, train_Y, batch_size, width_shift_range=10, height_shift_range=10):\n",
    "    width = train_X.shape[2]\n",
    "    height = train_X.shape[1]\n",
    "    while True:\n",
    "        shuffle_index = np.random.permutation(train_X.shape[0])\n",
    "        batch_count = shuffle_index.size // batch_size\n",
    "        for i in range(batch_count):\n",
    "            batch_index = shuffle_index[i * batch_size:(i + 1) * batch_size]\n",
    "            batch_X = train_X[batch_index]\n",
    "            batch_Y = train_Y[batch_index]\n",
    "            width_shift = np.random.randint(-width_shift_range, width_shift_range)\n",
    "            height_shift = np.random.randint(-height_shift_range, height_shift_range)\n",
    "            if width_shift >= 0:\n",
    "                if height_shift >= 0:\n",
    "                    batch_X[:, height_shift:, width_shift:, :] =\\\n",
    "                    batch_X[:, :height-height_shift, :width-width_shift, :]\n",
    "                    batch_Y[:, height_shift:, width_shift:, :] =\\\n",
    "                    batch_Y[:, :height-height_shift, :width-width_shift, :]\n",
    "                else:\n",
    "                    batch_X[:, :height+height_shift, width_shift:, :] =\\\n",
    "                    batch_X[:, -height_shift:, :width-width_shift, :]\n",
    "                    batch_Y[:, :height+height_shift, width_shift:, :] =\\\n",
    "                    batch_Y[:, -height_shift:, :width-width_shift, :]\n",
    "            else:\n",
    "                if height_shift >= 0:\n",
    "                    batch_X[:, height_shift:, :width+width_shift, :] =\\\n",
    "                    batch_X[:, :height-height_shift, -width_shift:, :]\n",
    "                    batch_Y[:, height_shift:, :width+width_shift, :] =\\\n",
    "                    batch_Y[:, :height-height_shift, -width_shift:, :]\n",
    "                else:\n",
    "                    batch_X[:, :height+height_shift, :width+width_shift, :] =\\\n",
    "                    batch_X[:, -height_shift:, -width_shift:, :]\n",
    "                    batch_Y[:, :height+height_shift, :width+width_shift, :] =\\\n",
    "                    batch_Y[:, -height_shift:, -width_shift:, :]\n",
    "            yield batch_X, batch_Y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 开始训练神经网络模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "if USE_TRAINING:\n",
    "    tbCallback = keras.callbacks.TensorBoard()\n",
    "    # model.fit(train_X, train_Y, batch_size=batch_size, epochs=epochs_num, callbacks=[tbCallback])\n",
    "    model.fit_generator(\n",
    "        generator_ex_dataset(train_X, train_Y, batch_size),\n",
    "        steps_per_epoch=train_X.shape[0] // batch_size, epochs=epochs_num, callbacks=[tbCallback])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存训练好的模型\n",
    "\n",
    "**PS：**可能需要安装 h5py 库，可以通过命令：`pip install h5py` 进行安装。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if USE_TRAINING:\n",
    "    if not os.path.isdir(model_dir): os.mkdir(model_dir)\n",
    "    model.save(os.path.join(model_dir, model_filename))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if os.path.isfile(os.path.join(model_dir, model_filename)):\n",
    "    model = keras.models.load_model(os.path.join(model_dir, model_filename),\n",
    "                                    custom_objects={'NMSE': NMSE})\n",
    "#     model = keras.models.load_model(os.path.join(model_dir, model_filename), compile=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 验证人工神经网络在训练集的效果\n",
    "\n",
    "其返回结果为[代价值，差距评估]，**如果数据量足够，最好使用测试集进行训练！**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "68/68 [==============================] - 1s 11ms/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.22982728568946614, 0.0029717408914995544]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(train_X, train_Y, batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffabe1a5ef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "i = 0\n",
    "plt.figure(figsize=(12, 6))\n",
    "plt.subplot(1, 3, 1)\n",
    "plt.imshow(datas[i])\n",
    "predict_Y = model.predict(train_X[i].reshape(1, 128, 128, -1), batch_size=batch_size)\n",
    "if classes_num == 1:\n",
    "    plt.subplot(1, 3, 2)\n",
    "    plt.imshow(train_Y[i, :,:, 0])\n",
    "    plt.subplot(1, 3, 3)\n",
    "    plt.imshow(predict_Y[0, :,:, 0])\n",
    "elif classes_num == 3:\n",
    "    plt.subplot(1, 3, 2)\n",
    "    plt.imshow(train_Y[i, :, :])\n",
    "    plt.subplot(1, 3, 3)\n",
    "    plt.imshow(predict_Y[0, :,:])\n",
    "else:\n",
    "    plt.subplot(1, 3, 2)\n",
    "    plt.imshow(train_Y[i, :, :].sum(axis=2))\n",
    "    plt.subplot(1, 3, 3)\n",
    "    plt.imshow(predict_Y[0, :,:].sum(axis=2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true,
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# for i in range(predict_Y.shape[-1]):\n",
    "#     drawAreaRect(predict_Y[0, :,:, i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# test_img = Image.open(\n",
    "#     'test_data/idcard.jpg').convert('RGB')\n",
    "# test_arr_formated = formatImage(test_img, (128, 128))\n",
    "# test_X = datas2X(test_arr_formated)\n",
    "# predict_test = model.predict(test_X)\n",
    "\n",
    "# t = 0\n",
    "\n",
    "# plt.figure(figsize=(16, 6))\n",
    "# plt.subplot(1, 2, 1)\n",
    "# plt.title('Image', size=16)\n",
    "# plt.imshow(test_arr_formated)\n",
    "# plt.subplot(1, 2, 2)\n",
    "# plt.title('Predict P Mask', size=16)\n",
    "# plt.imshow(predict_test[0, :,:, t])\n",
    "\n",
    "# a = 128\n",
    "# boxs = calcAreaBoxs(predict_test[0, :,:, t])\n",
    "# boxs_arr = calcSourceBoxs(test_img, boxs, a).astype('int')\n",
    "\n",
    "# fig, ax = plt.subplots(figsize=(10, 6))\n",
    "# ax.imshow(np.asanyarray(test_img))\n",
    "\n",
    "# for box in boxs_arr:\n",
    "#     minr, minc = box[0]\n",
    "#     maxr, maxc = box[1]\n",
    "#     rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,\n",
    "#                               fill=False, edgecolor='red', linewidth=2)\n",
    "#     ax.add_patch(rect)\n",
    "\n",
    "# plt.show()\n",
    "# boxs_arr.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# test_arr = np.array(test_img).mean(axis=2)\n",
    "# calcAccurateBoxs(test_arr, boxs_arr)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
